/*
    使用Jsoncpp实现序列化和反序列化
*/

#pragma once

#include <iostream>
#include <string>
#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>
#include "log.hpp"

namespace JsonMuduoRPC
{
    class JSON
    {
    public:
        static bool serialize(const Json::Value &root, std::string &body)
        {
            // 先实例化一个工厂类对象
            Json::StreamWriterBuilder writer_builder;

            // 配置StreamWriterBuilder，使其不进行Unicode转义
            writer_builder.settings_["emitUTF8"] = true;

            // 再用工厂类对象生产派生类对象
            std::unique_ptr<Json::StreamWriter> writer(writer_builder.newStreamWriter());

            std::stringstream ss;

            int ret = writer->write(root, &ss); // 将生成的Json字符串输出到ss字符串流中
            if (ret != 0)
            {
                LOG(FATAL, "serialize failed!!!");
                return false;
            }

            body = ss.str();
            return true;
        }

        static bool unserialize(const std::string &body, Json::Value &root)
        {
            // 实例化一个工厂类
            Json::CharReaderBuilder reader_builder;

            // 用工厂类生产一个对象
            std::unique_ptr<Json::CharReader> reader(reader_builder.newCharReader());

            // 将反序列化的结果存入root中
            std::string err;
            bool ret = reader->parse(body.c_str(), body.c_str() + body.size(), &root, &err);
            if (ret == false)
            {
                LOG(FATAL, "unserialize failed: %s", err.c_str());
                return false;
            }
            return true;
        }
    };
} // namespace JsonMuduoRPC
